home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 01 (1989-01)(MicroSPARC)(Side A).zip
/
Nibble Volume 10, No. 01 (1989-01)(MicroSPARC)(Side A).po
/
MEMORY.PEEKER.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
29KB
|
430 lines
0001 1800 ***********************************
0002 1800 * *
0003 1800 * MEMORY PEEKER *
0004 1800 * interpreted by Sandy Mossberg *
0005 1800 * *
0006 1800 * Copyright (C) 1988 *
0007 1800 * by MicroSPARC, Inc. *
0008 1800 * Concord, MA 01742 *
0009 1800 * *
0010 1800 ***********************************
0011 1800
0012 1800 ; Zero Page Equates:
0013 1800
0014 1800 BytConvRef GEQU $80 ;ASCII conversion base point
0015 1800 LinCounter GEQU $80 ;line output counter (W)
0016 1800 BlkHandle GEQU $82 ;handle to memory block (L)
0017 1800 BlkRecord GEQU $85 ;start of block record data
0018 1800 BlkSize GEQU $8D ;size of memory block (L)
0019 1800 FwdLinkPtr GEQU $95 ;ptr to next block record (L)
0020 1800 CurrFreCnt GEQU $99 ;current free memory (L)
0021 1800 TotFreCnt GEQU $9D ;total free memory (L)
0022 1800 LinString GEQU $A1 ;start of line data string
0023 1800 ; ; ($A1=length, $A2-->=text)
0024 1800
0025 1800 ; ORG $FF1800 ;ROM code in bank $FF
0026 1800
0027 1800 MP_Code START
0028 1800
0029 1800 *****************************************************************
0030 1800 *
0031 1800 * CDA Installation Code:
0032 1800 *
0033 1800 *****************************************************************
0034 1800
0035 1800 C2 30 MP_Install REP #%00110000 ;clear m,x flags
0036 1802 LONGA ON ; 16-bit accum/memory
0037 1802 LONGI ON ; 16-bit index
0038 1802 F4 FF 00 PEA MP_Handle|-16 ;handle to CDA header
0039 1805 F4 91 1A PEA MP_Handle ; ($FF1A91)
0040 1808 A2 05 0F LDX #$0F05 ;InstallCDA
0041 180B 22 00 00 E1 JSL $E10000
0042 180F 6B RTL
0043 1810
0044 1810 *****************************************************************
0045 1810 *
0046 1810 * CDA Code:
0047 1810 *
0048 1810 *****************************************************************
0049 1810 ;
0050 1810 ; Initialize
0051 1810 ;
0052 1810 ; Save current output configuration on stack:
0053 1810
0054 1810 F4 00 00 MP_Start PEA $0000 ;space for output device code
0055 1813 F4 00 00 PEA $0000 ;space for output slot/vector
0056 1816 F4 00 00 PEA $0000
0057 1819 A2 0C 13 LDX #$130C ;GetOutputDevice
0058 181C 22 00 00 E1 JSR $E10000 ; (leave on stack)
0059 1820
0060 1820 F4 00 00 PEA $0000 ;space for output AND mask
0061 1823 F4 00 00 PEA $0000 ;space for output OR mask
0062 1826 A2 0C 0D LDX #$0D0C ;GetOutGlobals
0063 1829 22 00 00 E1 JSR $E10000 ; (leave on stack)
0064 182D
0065 182D ; Set slot 3 text output (negative ASCII):
0066 182D
0067 182D F4 FF 00 PEA $00FF ;AND mask (no change)
0068 1830 F4 80 00 PEA $0080 ;OR mask (set high bit)
0069 1833 A2 0C 0A LDX #$0A0C ;SetOutGlobals
0070 1836 22 00 00 E1 JSR $E10000
0071 183A
0072 183A F4 00 00 PEA $0000 ;BASIC device type
0073 183D F4 00 00 PEA $0000 ;input from slot 3
0074 1840 F4 03 00 PEA $0003
0075 1843 A2 0C 10 LDX #$100C ;SetOutputDevice
0076 1846 22 00 00 E1 JSR $E10000
0077 184A
0078 184A F4 00 00 PEA $0000 ;init input device
0079 184D A2 0C 15 LDX #$150C ;InitTextDev
0080 1850 22 00 00 E1 JSR $E10000
0081 1854
0082 1854 F4 01 00 PEA $0001 ;init output device
0083 1857 A2 0C 15 LDX #$150C ;InitTextDev
0084 185A 22 00 00 E1 JSR $E10000
0085 185E ;................................................................
0086 185E ;
0087 185E ; Display menu:
0088 185E ;
0089 185E C2 30 ShowMenu REP #%00110000 ;clear m,x flags
0090 1860 LONGA ON ; 16-bit accum/memory
0091 1860 LONGI ON ; 16-bit index
0092 1860 F4 FF 00 PEA MenuText|-16 ;pointer to text string
0093 1863 F4 E3 19 PEA MenuText ; ($FF19E3)
0094 1866 A2 0C 1A LDX #$1A0C ;WriteLine
0095 1869 22 00 00 E1 JSR $E10000
0096 186D ;................................................................
0097 186D ;
0098 186D ; Get user command and route valid requests:
0099 186D ;
0100 186D MSB OFF ;generate pos ASCII chars
0101 186D
0102 186D F4 00 00 GetCommand PEA $0000 ;space for ASCII char code
0103 1870 F4 00 00 PEA $0000 ;no echo
0104 1873 A2 0C 22 LDX #$220C ;ReadChar
0105 1876 22 00 00 E1 JSR $E10000
0106 187A 68 PLA ;retrieve input
0107 187B 29 7F 00 AND #$007F ;convert to positive ASCII
0108 187E C9 61 00 CMP #'a'
0109 1881 90 03 BCC GC1 ;upper case found
0110 1883 49 20 00 EOR #$0020 ;shift low case to up case
0111 1886 C9 55 00 GC1 CMP #'U'
0112 1889 F0 20 BEQ DoUSED ;Used list requested
0113 188B C9 50 00 CMP #'P'
0114 188E F0 20 BEQ DoPURGE ;Purge list requested
0115 1890 C9 46 00 CMP #'F'
0116 1893 F0 20 BEQ DoFREE ;Free list requested
0117 1895 C9 51 00 CMP #'Q'
0118 1898 D0 D3 BNE GetCommand ;invalid char so get another
0119 189A ;................................................................
0120 189A ;
0121 189A ; QUIT handler:
0122 189A ;
0123 189A C2 30 REP #%00110000 ;clear m,x flags
0124 189C LONGA ON ; 16-bit accum/memory
0125 189C LONGI ON ; 16-bit index
0126 189C A2 0C 0A LDX #$0A0C ;SetOutGlobals
0127 189F 22 00 00 E1 JSR $E10000 ; (on stack)
0128 18A3 A2 0C 10 LDX #$100C ;SetOutputDevice
0129 18A6 22 00 00 E1 JSR $E10000 ; (on stack)
0130 18AA 6B MP_Shut RTL
0131 18AB ;................................................................
0132 18AB ;
0133 18AB ; USED list handler:
0134 18AB ;
0135 18AB A2 00 00 DoUSED LDX #$0000 ;index used block records
0136 18AE 80 0A BRA DoList ;to common list handler
0137 18B0 ;................................................................
0138 18B0 ;
0139 18B0 ; PURGE list handler:
0140 18B0 ;
0141 18B0 A2 04 00 DoPURGE LDX #$0004 ;index purged block records
0142 18B3 80 05 BRA DoList ;to common list handler
0143 18B5 ;................................................................
0144 18B5 ;
0145 18B5 ; FREE list handler:
0146 18B5 ;
0147 18B5 A2 08 00 DoFREE LDX #$0008 ;index free block records
0148 18B8 80 00 BRA DoList ;[superfluous instruction]
0149 18BA ;................................................................
0150 18BA ;
0151 18BA ; Common list handler:
0152 18BA ;
0153 18BA ; Point at first block record in selected chain:
0154 18BA
0155 18BA 08 DoList PHP ;save entry status
0156 18BB 78 SEI ;disable interrupts
0157 18BC BF 00 16 E1 LDA $E11600,X ;point at selected
0158 18C0 85 82 STA BlkHandle ; block records
0159 18C2 BF 02 16 E1 LDA $E11602,X
0160 18C6 85 84 STA BlkHandle+2
0161 18C8
0162 18C8 ; Zero counters:
0163 18C8
0164 18C8 64 80 STZ LinCounter
0165 18CA 64 9D STZ TotFreCnt
0166 18CC 64 9F STZ TotFreCnt+2
0167 18CE
0168 18CE ; Print headers for block record data:
0169 18CE
0170 18CE F4 FF 00 PEA DataText|-16 ;pointer to text string
0171 18D1 F4 16 1A PEA DataText ; ($FF1A16)
0172 18D4 A2 0C 1A LDX #$1A0C ;WriteLine
0173 18D7 22 00 00 E1 JSR $E10000
0174 18DB E2 30 SEP #%00110000 ;set m,x flags
0175 18DD LONGA OFF ; 8-bit accum/memory
0176 18DD LONGI OFF ; 8-bit index
0177 18DD
0178 18DD ; Check end of block record chain:
0179 18DD
0180 18DD A5 82 NextRecord LDA BlkHandle
0181 18DF 05 83 ORA BlkHandle+1
0182 18E1 05 84 ORA BlkHandle+2
0183 18E3 D0 1F BNE DoString ;another record in chain
0184 18E5
0185 18E5 ; Check free memory count when block record chain completed:
0186 18E5
0187 18E5 A5 9D LDA TotFreCnt
0188 18E7 05 9E ORA TotFreCnt+1
0189 18E9 05 A0 ORA TotFreCnt+3 ;[should be ORA TotFreCnt+2]
0190 18EB F0 13 BEQ ListDone ;don't print zero free count
0191 18ED
0192 18ED ; Setup and print total free memory count:
0193 18ED
0194 18ED A2 3C LDX #$3C ;put text in line buffer
0195 18EF ; ;[LDA #$35 more logical]
0196 18EF BF 52 1A FF PrtTotFre LDA >TotFreText,X ;get char at $FF1A52,X
0197 18F3 95 A1 STA LinString,X ;put into line string buffer
0198 18F5 CA DEX
0199 18F6 10 F7 BPL PrtTotFre ;get another char
0200 18F8 A2 1D LDX #$1D ;"Total Free Memory"
0201 18FA 20 9A 19 JSR Conv3Byt ; at $9D-$9F
0202 18FD 20 CF 19 JSR PrintLine ;print the line
0203 1900
0204 1900 ; List completed:
0205 1900
0206 1900 28 ListDone PLP ;restore entry status
0207 1901 4C 5E 18 JMP ShowMenu ;get another menu selection
0208 1904 ;................................................................
0209 1904 ;
0210 1904 ; Prepare and print string containing data from one block record:
0211 1904 ;
0212 1904 ; Transfer 20-byte block record to $85-$98:
0213 1904
0214 1904 64 A1 DoString STZ LinString ;zero length byte of string
0215 1906 A0 13 LDY #$13 ;index 19(+1) bytes
0216 1908 B7 82 TfrBlkRec LDA [BlkHandle],Y ;FROM block record
0217 190A BB TYX
0218 190B 95 85 STA BlkRecord,X ;TO zero page
0219 190D 88 DEY
0220 190E 10 F8 BPL TfrBlkRec ;back for more
0221 1910
0222 1910 ; Zero free count bytes for this segment:
0223 1910
0224 1910 C2 20 REP #%00100000 ;clear m flag
0225 1912 LONGA ON ; 16-bit accum/memory
0226 1912 64 99 STZ CurrFreCnt
0227 1914 64 9B STZ CurrFreCnt+2
0228 1916
0229 1916 ; If at end of block record chain, do not calculate free space:
0230 1916
0231 1916 A5 95 LDA FwdLinkPtr
0232 1918 05 97 ORA FwdLinkPtr+2
0233 191A F0 2F BEQ SetString ;forward link = 0
0234 191C A0 02 LDY #$02
0235 191E A7 95 LDA [FwdLinkPtr]
0236 1920 17 95 ORA [FwdLinkPtr],Y
0237 1922 F0 27 BEQ SetString ;next master ptr = 0
0238 1924
0239 1924 ; Calculate current free space:
0240 1924
0241 1924 ;--> Calculate area between this memory segment and next segment:
0242 1924
0243 1924 A7 95 LDA [FwdLinkPtr] ;Start of next segment (lo)
0244 1926 38 SEC ; minus
0245 1927 E7 82 SBC [BlkHandle] ; start of this segment (lo)
0246 1929 85 99 STA CurrFreCnt ; = intersegmental size (lo)
0247 192B B7 95 LDA [FwdLinkPtr],Y ;Start of next seg (hi) minus
0248 192D F7 82 SBC [BlkHandle],Y ; start of this segment (hi)
0249 192F 85 9B STA CurrFreCnt+2 ; = intersegmental size (hi)
0250 1931
0251 1931 ;--> Free space = difference between above value and block size:
0252 1931
0253 1931 A5 99 LDA CurrFreCnt ;Intersegmental size (lo)
0254 1933 38 SEC ; minus
0255 1934 E5 8D SBC BlkSize ; size of current block (lo)
0256 1936 85 99 STA CurrFreCnt ; = free space (lo)
0257 1938 A5 9B LDA CurrFreCnt+2 ;Interseg size (hi) minus
0258 193A E5 8F SBC BlkSize+2 ; size of current block (hi)
0259 193C 85 9B STA CurrFreCnt+2 ; = free space (hi)
0260 193E
0261 193E ; Add current free space to total free space:
0262 193E
0263 193E A5 99 LDA CurrFreCnt ;current free space (lo)
0264 1940 18 CLC ; plus
0265 1941 65 9D ADC TotFreCnt ; total free space (lo)
0266 1943 85 9D STA TotFreCnt ; = new total free space (lo)
0267 1945 A5 9B LDA CurrFreCnt+2 ;current free space (hi) plus
0268 1947 65 9F ADC TotFreCnt+2 ; total free space (hi)
0269 1949 85 9F STA TotFreCnt+2 ; = new total free space (hi)
0270 194B
0271 194B ; Convert zero page hex data to ASCII line string:
0272 194B
0273 194B E6 80 SetString INC LinCounter ;bump block record count
0274 194D E2 30 SEP #%00110000 ;set m,x flags
0275 194F LONGA OFF ; 8-bit accum/memory
0276 194F LONGI OFF ; 8-bit index
0277 194F A2 00 LDX #$00 ;line count ("#")
0278 1951 20 A1 19 JSR Conv2Byt ; at $80-$81
0279 1954 A2 02 LDX #$02 ;handle ("Handle")
0280 1956 20 9A 19 JSR Conv3Byt ; at $82-$84
0281 1959 A2 05 LDX #$05 ;master pointer ("Addr")
0282 195B 20 9A 19 JSR Conv3Byt ; at $85-$87
0283 195E A2 09 LDX #$09 ;attributes ("Attr")
0284 1960 20 A1 19 JSR Conv2Byt ; at $89-$8A
0285 1963 A2 0B LDX #$0B ;owner ID ("ID")
0286 1965 20 A1 19 JSR Conv2Byt ; at $8B-$8C
0287 1968 A2 0D LDX #$0D ;block size ("Size")
0288 196A 20 93 19 JSR Conv4Byt ; at $8D-$90
0289 196D A2 11 LDX #$11 ;backward link ("Prev")
0290 196F 20 9A 19 JSR Conv3Byt ; at $91-$93
0291 1972 A2 15 LDX #$15 ;forward link ("Next")
0292 1974 20 9A 19 JSR Conv3Byt ; at $95-$97
0293 1977 A5 99 LDA CurrFreCnt
0294 1979 05 9A ORA CurrFreCnt+1
0295 197B 05 9B ORA CurrFreCnt+2
0296 197D F0 05 BEQ LineOut ;free count = 0 so skip it
0297 197F A2 19 LDX #$19 ;current free count ("Free")
0298 1981 20 9A 19 JSR Conv3Byt ; at $99-$9B
0299 1984
0300 1984 ; Print line string (i.e. one line of data):
0301 1984
0302 1984 20 CF 19 LineOut JSR PrintLine
0303 1987
0304 1987 ; Set handle to next block:
0305 1987
0306 1987 A2 03 LDX #$03 ;transfer 4 bytes from
0307 1989 B5 95 NextHandle LDA FwdLinkPtr,X ; forward link pointer
0308 198B 95 82 STA BlkHandle,X ; to zero page
0309 198D CA DEX
0310 198E 10 F9 BPL NextHandle
0311 1990 4C DD 18 JMP NextRecord ;back for next block record
0312 1993 ;................................................................
0313 1993 ;
0314 1993 ; Convert 2-4 hex bytes to ASCII and place at end of line string:
0315 1993 ;
0316 1993 DA Conv4Byt PHX ;save X-reg
0317 1994 B5 83 LDA BytConvRef+3,X ;get 4th byte, convert to
0318 1996 20 B1 19 JSR SetStrByte ; ASCII and add to string
0319 1999 FA PLX ;restore X-reg
0320 199A
0321 199A DA Conv3Byt PHX ;save X-reg
0322 199B B5 82 LDA BytConvRef+2,X ;get 3rd byte, convert to
0323 199D 20 B1 19 JSR SetStrByte ; ASCII and add to string
0324 19A0 FA PLX ;restore X-reg
0325 19A1
0326 19A1 DA Conv2Byt PHX ;save X-reg
0327 19A2 B5 81 LDA BytConvRef+1,X ;get 2nd byte, convert to
0328 19A4 20 B1 19 JSR SetStrByte ; ASCII and add to string
0329 19A7 FA PLX ;restore X-reg
0330 19A8
0331 19A8 B5 80 LDA BytConvRef,X ;get 1st byte, convert to
0332 19AA 20 B1 19 JSR SetStrByte ; ASCII and add to string
0333 19AD 20 CB 19 JSR AddSpace ;add space to line string
0334 19B0 60 RTS
0335 19B1 ;................................................................
0336 19B1 ;
0337 19B1 ; Place ASCII data at end of line string:
0338 19B1 ;
0339 19B1 ; Convert hex byte to ASCII:
0340 19B1
0341 19B1 MSB ON ;generate neg ASCII chars
0342 19B1
0343 19B1 48 SetStrByte PHA ;save byte
0344 19B2 4A LSR A ;isolate high order digit
0345 19B3 4A LSR A
0346 19B4 4A LSR A
0347 19B5 4A LSR A
0348 19B6 20 BC 19 JSR HexToAscii ;convert hex digit to ASCII
0349 19B9 68 PLA ;restore byte
0350 19BA 29 0F AND #$0F ;isolate low order digit
0351 19BC
0352 19BC ; Convert hex digit to negative ASCII:
0353 19BC
0354 19BC 09 B0 HexToAscii ORA #'0'
0355 19BE C9 BA CMP #'9'+1
0356 19C0 90 02 BCC AddToStr ;$01-$09
0357 19C2 69 06 ADC #$06 ;$0A-$0F
0358 19C4
0359 19C4 ; Put character at end of line string:
0360 19C4
0361 19C4 A6 A1 AddToStr LDX LinString ;get length of string
0362 19C6 95 A2 STA LinString+1,X ;put char at end of string
0363 19C8 E6 A1 INC LinString ;bump length of string
0364 19CA 60 RTS
0365 19CB
0366 19CB ; Put space at end of line string:
0367 19CB
0368 19CB A9 A0 AddSpace LDA #' ' ;neg ASCII space
0369 19CD 80 F5 BRA AddToStr
0370 19CF
0371 19CF ;................................................................
0372 19CF ;
0373 19CF ; Print one line of data (i.e. line string):
0374 19CF ;
0375 19CF C2 30 PrintLine REP #%00110000 ;clear m,x flags
0376 19D1 LONGA ON ; 16-bit accum/memory
0377 19D1 LONGI ON ; 16-bit index
0378 19D1 F4 00 00 PEA LinString|-16 ;pointer to text string
0379 19D4 F4 A1 00 PEA LinString ; ($A1)
0380 19D7 A2 0C 1A LDX #$1A0C ;WriteLine
0381 19DA 22 00 00 E1 JSR $E10000
0382 19DE E2 30 SEP #%00110000 ;set m,x flags
0383 19E0 LONGA OFF ; 8-bit accum/memory
0384 19E0 LONGI OFF ; 8-bit index
0385 19E0 64 A1 STZ LinString ;zero leading length byte
0386 19E2 60 RTS
0387 19E3 ;................................................................
0388 19E3 ;
0389 19E3 ; Text:
0390 19E3 ;
0391 19E3 32 MenuText DC H'32' ;length byte
0392 19E4 D5 BD A0 D5 DC C'U= Used list P= Purge list F= Free list '
0393 1A0F D1 BD A0 D1 DC C'Q= Quit'
0394 1A16
0395 1A16 3B DataText DC H'3B' ;length byte
0396 1A17 8D 8D DC H'8D 8D'
0397 1A19 A3 A0 A0 A0 DC C'# Handle Addr Attr ID Size '
0398 1A40 D0 F2 E5 F6 DC C'Prev Next Free'
0399 1A52
0400 1A52 35 TotFreText DC H'35' ;length byte
0401 1A53 8D DC H'8D'
0402 1A54 A0 A0 A0 A0 DC 34C' '
0403 1A76 D4 EF F4 E1 DC C'Total Free Memory '
0404 1A88
0405 1A88 BD A0 A0 A0 DC C'= ' ;used by PrtTotFre
0406 1A91 ; ;[superfluous]
0407 1A91
0408 1A91 *****************************************************************
0409 1A91 *
0410 1A91 * Handle to CDA Header:
0411 1A91 *
0412 1A91 *****************************************************************
0413 1A91
0414 1A91 95 1A FF 00 MP_Handle DC I4'MP_Header'
0415 1A95
0416 1A95 *****************************************************************
0417 1A95 *
0418 1A95 * CDA Header:
0419 1A95 *
0420 1A95 *****************************************************************
0421 1A95
0422 1A95 MSB OFF ;generate pos ASCII chars
0423 1A95
0424 1A95 0D MP_Header DC H'0D' ;length byte
0425 1A96 4D 65 6D 6F DC C'Memory Peeker' ;title
0426 1AA3 10 18 FF 00 DC I4'MP_Start' ;startup entry
0427 1AA7 AA 18 FF 00 DC I4'MP_Shut' ;shutdown entry
0428 1AAB
0429 1AAB END